package com.atguigu.java;

import org.junit.Test;

import java.util.HashSet;
import java.util.Set;

/**
 * Created by Chauncey on 2019/6/1.
 */
public class SetTest {
    /**
     * 一、Set：存储无序的、不可重复的数据
     * 以HashSet为例说明：
     *  1.无序性
     *     答：不等于随机性。存储的数据在底层数组中并非按照数组索引的顺序添加，而是根据数据的哈希值决定的。
     *  2.不可重复性
     *     答：保证添加的元素按照equals()判断时，不能返回true。即：相同的元素只能添加一个。
     *
     * 二、添加元素的过程中：以HashSet为例：
     *  我们向HashSet中添加元素a，首先调用元素a所在类的hashCode方法，计算出a的哈希值，此hash值接着通过某种算法计算出
     *  HashSet底层数组中的存放位置（即为：索引位置），判断数组的此位置上是否已经存在元素了：
     *      如果此位置上不存在其他元素，则元素a添加成功。     -->情况1
     *      如果此位置上存在其他元素b（或者以链表形式存在多个元素），则需要比较元素a与元素b的hash值：
     *          如果hash值不同，则元素a添加成功。     -->情况2
     *          如果hash值相同，从而需要调用元素a所在类中的equals方法:
     *              如果equals方法返回true,则添加元素a失败
     *              如果equals返回false,则添加元素a成功    -->情况3
     *   对于添加的情况2和情况3而言：元素a与已经存在指定索引位置上数据已链表的方式进行存储
     *   JDK7：元素a放到数组中，指向原来的元素
     *   JDK8：原来的元素在数组中，指向元素a
     *   总结：七上八下
     */
    @Test
    public void test1(){
        Set set = new HashSet();
        set.add(1);
    }
}
